home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume13 / gmcalc / part18 < prev    next >
Encoding:
Text File  |  1990-06-05  |  57.7 KB  |  1,346 lines

  1. Newsgroups: comp.sources.misc
  2. From: daveg@csvax.caltech.edu (David Gillespie)
  3. Subject: v13i044: Emacs Calculator 1.01, part 18/19
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 13, Issue 44
  7. Submitted-by: daveg@csvax.caltech.edu (David Gillespie)
  8. Archive-name: gmcalc/part18
  9.  
  10. ---- Cut Here and unpack ----
  11. #!/bin/sh
  12. # this is part 18 of a multipart archive
  13. # do not concatenate these parts, unpack them in order with /bin/sh
  14. # file calc.texinfo continued
  15. #
  16. CurArch=18
  17. if test ! -r s2_seq_.tmp
  18. then echo "Please unpack part 1 first!"
  19.      exit 1; fi
  20. ( read Scheck
  21.   if test "$Scheck" != $CurArch
  22.   then echo "Please unpack part $Scheck next!"
  23.        exit 1;
  24.   else exit 0; fi
  25. ) < s2_seq_.tmp || exit 1
  26. echo "x - Continuing file calc.texinfo"
  27. sed 's/^X//' << 'SHAR_EOF' >> calc.texinfo
  28. XPairs of @kbd{Z `} and @kbd{Z '} characters may be nested.
  29. X
  30. XIf a keyboard macro halts due to an error in between a @kbd{Z `} and
  31. X@kbd{Z '}, the saved values will be restored correctly even though
  32. Xthe macro never reaches the @kbd{Z '} command.  Thus you can use
  33. X@kbd{Z `} and @kbd{Z '} without having to worry about what happens
  34. Xin exceptional conditions.
  35. X
  36. XIf you type @kbd{Z `} ``live'' (not in a keyboard macro), Calc puts
  37. Xyou into a ``recursive edit.''  You can tell you are in a recursive
  38. Xedit because there will be extra square brackets in the mode line,
  39. Xas in @samp{[(Calculator)]}.  These brackets will go away when you
  40. Xtype the matching @kbd{Z '} command.  The modes and quick variables
  41. Xwill be saved and restored in just the same way as if actual keyboard
  42. Xmacros were involved.
  43. X
  44. XThe modes saved by @kbd{Z `} and @kbd{Z '} are the current precision
  45. Xand word size, the angular mode (Deg, Rad, or HMS), the simplification
  46. Xmode, the matrix mapping direction, Algebraic mode, Symbolic mode,
  47. XFraction mode, and the current complex mode (Polar or Rectangular).
  48. XThe ten ``quick'' variables' values (or lack thereof) are also saved.
  49. X
  50. XMost mode-setting commands act as toggles, but with a numeric prefix
  51. Xthey force the mode either on (positive prefix) or off (negative
  52. Xor zero prefix).  Since you don't know what the environment might
  53. Xbe when you invoke your macro, it's best to use prefix arguments
  54. Xfor all mode-setting commands inside the macro.
  55. X
  56. XThe contents of the stack and trail, values of non-quick variables, and
  57. Xother settings such as the various display modes, are @emph{not}
  58. Xaffected by @kbd{Z `} and @kbd{Z '}.
  59. X
  60. X@node Queries in Macros, , Local Values in Macros, Keyboard Macros
  61. X@subsection Queries in Keyboard Macros
  62. X
  63. X@kindex Z =
  64. X@pindex calc-kbd-report
  65. XThe @kbd{Z =} (@code{calc-kbd-report}) command displays an informative
  66. Xmessage including the value on the top of the stack.  You are prompted
  67. Xto enter a string.  That string, along with the top-of-stack value,
  68. Xis displayed unless @kbd{m w} (@code{calc-working}) has been used
  69. Xto turn such messages off.
  70. X
  71. X@kindex Z #
  72. X@pindex calc-kbd-query
  73. XThe @kbd{Z #} (@code{calc-kbd-query}) command displays a prompt message
  74. X(which you enter during macro definition), then does an algebraic entry
  75. Xwhich takes its input from the keyboard, even during macro execution.
  76. XThis command allows your keyboard macros to accept numbers or formulas
  77. Xas interactive input.  All the normal conventions of algebraic input,
  78. Xincluding the use of @kbd{$} characters, are supported.
  79. X@xref{Kbd Macro Query, , , emacs, the Emacs manual}, for a description of
  80. X@kbd{C-x q} (@code{kbd-macro-query}), the standard Emacs way to accept
  81. Xkeyboard input during a keyboard macro.  In particular, you can use
  82. X@kbd{C-x q} to enter a recursive edit, which allows the user to perform
  83. Xany Calculator operations interactively before pressing @kbd{C-M-c} to
  84. Xreturn control to the keyboard macro.
  85. X
  86. X@node Algebraic Definitions, Lisp Definitions, Keyboard Macros, Programming
  87. X@section Programming with Algebraic Formulas
  88. X
  89. X@kindex Z F
  90. X@pindex calc-user-define-formula
  91. X@cindex Programming with algebraic formulas
  92. XAnother way to create a new Calculator command uses algebraic formulas.
  93. XThe @kbd{Z F} (@code{calc-user-define-formula}) command stores the
  94. Xformula at the top of the stack as the definition for a key.  This
  95. Xcommand prompts for five things: The key, the command name, the function
  96. Xname, the argument list, and the behavior of the command when given
  97. Xnon-numeric arguments.
  98. X
  99. XFor example, suppose we type @kbd{' a+2b @key{RET}} to push the formula
  100. X@samp{a + 2*b} onto the stack.  We now type @kbd{Z F m} to define this
  101. Xformula on the @kbd{z m} key sequence.  The next prompt is for a command
  102. Xname, beginning with @samp{calc-}, which should be the long (@kbd{M-x}) form
  103. Xfor the new command.  If you simply press @key{RET}, a default name like
  104. X@code{calc-User-m} will be constructed.  In our example, suppose we enter
  105. X@kbd{spam @key{RET}} to define the new command as @code{calc-spam}.
  106. X
  107. XIf you want to give the formula a long-style name only, you can press
  108. X@key{SPC} or @key{RET} when asked which single key to use.  For example
  109. X@kbd{Z F @key{RET} spam @key{RET}} defines the new command as @code{calc-spam},
  110. Xwith no keyboard equivalent.
  111. X
  112. XThe third prompt is for a function name.  The default is to use the same
  113. Xname as the command name but with @samp{calcFunc-} in place of
  114. X@samp{calc-}.  This is the name you will use if you want to enter your
  115. Xnew function in an algebraic formula.  Suppose we enter @kbd{yow @key{RET}}.
  116. XThen the new function can be invoked by pushing two numbers on the
  117. Xstack and typing @kbd{z m} or @kbd{x spam}, or by entering the algebraic
  118. Xformula @samp{yow(x,y)}.@refill
  119. X
  120. XThe fourth prompt is for the function's argument list.  This is used to
  121. Xassociate values on the stack with the variables that appear in the formula.
  122. XThe default is a list of all variables which appear in the formula, sorted
  123. Xinto alphabetical order.  In our case, the default would be @samp{(a b)}.
  124. XThis means that, when the user types @kbd{z m}, the Calculator will remove
  125. Xtwo numbers from the stack, substitute these numbers for @samp{a} and
  126. X@samp{b} (respectively) in the formula, then simplify the formula and
  127. Xpush the result on the stack.  In other words, @kbd{10 @key{RET} 100 z m}
  128. Xwould replace the 10 and 100 on the stack with the number 210, which is
  129. X@samp{a + 2*b} with @samp{a=10} and @samp{b=100}.  Likewise, the formula
  130. X@samp{yow(10, 100)} will be evaluated by substituting @samp{a=10} and
  131. X@samp{b=100} in the definition.
  132. X
  133. XYou can rearrange the order of the names before pressing @key{RET} to
  134. Xcontrol which stack positions go to which variables in the formula.  If
  135. Xyou remove a variable from the argument list, that variable will be left
  136. Xin symbolic form by the command.  Thus using an argument list of @samp{(b)}
  137. Xfor our function would cause @kbd{10 z m} to replace the 10 on the stack
  138. Xwith the formula @samp{a + 20}.  If we had used an argument list of
  139. X@samp{(b a)}, the result with inputs 10 and 100 would have been 120.
  140. X
  141. XThe final prompt is a y-or-n question concerning what to do if symbolic
  142. Xarguments are given to your function.  If you answer @kbd{y}, then
  143. Xexecuting @kbd{z m} (using the original argument list @samp{(a b)}) with
  144. Xarguments @samp{10} and @samp{x} will leave the function in symbolic
  145. Xform, i.e., @samp{yow(10,x)}.  On the other hand, if you answer @kbd{n},
  146. Xthen the formula will always be expanded, even for non-constant
  147. Xarguments: @samp{10 + 2 * x}.  If you never plan to feed algebraic
  148. Xformulas to your new function, it doesn't matter how you answer this
  149. Xquestion.@refill
  150. X
  151. X@kindex Z G
  152. X@pindex calc-get-user-defn
  153. XOnce you have defined a formula on a key, you can retrieve this formula
  154. Xwith the @kbd{Z G} (@code{calc-user-define-get-defn}) command.  Press a
  155. Xkey, and this command pushes the formula that was used to define that
  156. Xkey onto the stack.  You will get an error message if the key is undefined,
  157. Xor if the key was not defined by a @kbd{Z F} command.@refill
  158. X
  159. XThe @kbd{Z E} (@code{calc-user-define-edit}) command on a key that has
  160. Xbeen defined by a formula uses a variant of the @code{calc-edit} command
  161. Xto edit the defining formula.  Press @kbd{C-c C-c} to finish editing and
  162. Xstore the new formula back in the definition, or kill the formula-editing
  163. Xbuffer with @kbd{C-x k} to cancel the edit.  (The argument list and other
  164. Xproperties of the definition are unchanged; to adjust the argument list,
  165. Xyou must use @kbd{Z G} to grab the formula onto the stack and then
  166. Xre-execute the @kbd{Z F} command.)
  167. X
  168. XAs usual, the @kbd{Z P} command records your definition permanently.
  169. XIn this case it will permanently record all three of the relevant
  170. Xdefinitions: the key, the command, and the function.
  171. X
  172. XYou may find it useful to turn off the default simplifications with
  173. X@kbd{m O} (@code{calc-no-simplify-mode}) when entering a formula to be
  174. Xused as a function definition.  For example, the formula @samp{deriv(a^2,v)}
  175. Xwhich might be used to define a new function @samp{dsqr(a,v)} will be
  176. X``simplified'' to 0 immediately upon entry since @code{deriv} considers
  177. X@samp{a} to be constant with respect to @samp{v}.  Turning off
  178. Xdefault simplifications cures this problem: the definition will be stored
  179. Xin symbolic form without ever activating the @code{deriv} function.  Press
  180. X@kbd{m D} to turn the default simplifications back on afterwards.
  181. X
  182. X@node Lisp Definitions, , Algebraic Definitions, Programming
  183. X@section Programming with Lisp
  184. X
  185. XThe Calculator can be programmed quite extensively in Lisp.  All you
  186. Xdo is write a normal Lisp function definition, but with @code{defmath}
  187. Xin place of @code{defun}.  This has the same form as @code{defun}, but it
  188. Xautomagically replaces calls to standard Lisp functions like @code{+} and
  189. X@code{zerop} with calls to the corresponding functions in Calc's own library.
  190. XThus you can write natural-looking Lisp code which operates on all of the
  191. Xstandard Calculator data types.  You can then use @kbd{Z D} if you wish to
  192. Xbind your new command to a @kbd{z}-prefix key sequence.  The @kbd{Z E} command
  193. Xwill not edit a Lisp-based definition.
  194. X
  195. XEmacs Lisp is described in the Emacs Lisp Reference Manual.  This section
  196. Xassumes a familiarity with Lisp programming concepts; if you do not know
  197. XLisp, you may find keyboard macros to be an easier way to program the
  198. XCalculator.
  199. X
  200. X@menu
  201. X* Defining Functions::
  202. X* Defining Simple Commands::
  203. X* Defining Stack Commands::
  204. X* Argument Qualifiers::
  205. X* Example Definitions::
  206. X* Internals::
  207. X@end menu
  208. X
  209. X@node Defining Functions, Defining Simple Commands, Lisp Definitions, Lisp Definitions
  210. X@subsection Defining New Functions
  211. X
  212. X@findex defmath
  213. XThe @code{defmath} function (actually a Lisp macro) is like @code{defun}
  214. Xexcept that code in the body of the definition can make use of the full
  215. Xrange of Calculator data types.  The prefix @samp{calcFunc-} is added
  216. Xto the specified name to get the actual Lisp function name.  As a simple
  217. Xexample,
  218. X
  219. X@example
  220. X(defmath myfact (n)
  221. X  (if (> n 0)
  222. X      (* n (myfact (1- n)))
  223. X    1))
  224. X@end example
  225. X
  226. X@noindent
  227. XThis actually expands to the code,
  228. X
  229. X@example
  230. X(defun calcFunc-myfact (n)
  231. X  (if (math-posp n)
  232. X      (math-mul n (calcFunc-myfact (math-add n -1)))
  233. X    1))
  234. X@end example
  235. X
  236. X@noindent
  237. XThis function can be used in algebraic expressions, e.g., @samp{myfact(5)}.
  238. X
  239. XThe @samp{myfact} function as it is defined above has the bug that an
  240. Xexpression @samp{myfact(a+b)} will be simplified to 1 because the
  241. Xformula @samp{a+b} is not considered to be @code{posp}.  A robust
  242. Xfactorial function would be written along the following lines:
  243. X
  244. X@example
  245. X(defmath myfact (n)
  246. X  (if (> n 0)
  247. X      (* (myfact (1- n)))
  248. X    (if (= n 0)
  249. X        1
  250. X      nil)))    ; this could be simplified as: (and (= n 0) 1)
  251. X@end example
  252. X
  253. XIf a function returns @code{nil}, it is left unsimplified by the Calculator
  254. X(except that its arguments will be simplified).  Thus, @samp{myfact(a+1+2)}
  255. Xwill be simplified to @samp{myfact(a+3)} but no further.  Beware that every
  256. Xtime the Calculator reexamines this formula it will attempt to resimplify
  257. Xit, so your function ought to detect the returning-@code{nil} case as
  258. Xefficiently as possible.
  259. X
  260. XThe following standard Lisp functions are treated by @code{defmath}:
  261. X@code{+}, @code{-}, @code{*}, @code{/}, @code{%}, @code{^} or
  262. X@code{expt}, @code{=}, @code{<}, @code{>}, @code{<=}, @code{>=},
  263. X@code{/=}, @code{1+}, @code{1-}, @code{logand}, @code{logior}, @code{logxor},
  264. X@code{logandc2}, @code{lognot}.  Also, @code{~=} is an abbreviation for
  265. X@code{math-nearly-equal}, which is useful in implementing Taylor series.@refill
  266. X
  267. XFor other functions @var{func}, if a function by the name
  268. X@samp{calcFunc-@var{func}} exists it is used, otherwise if a function by the
  269. Xname @samp{math-@var{func}} exists it is used, otherwise if @var{func} itself
  270. Xis defined as a function it is used, otherwise @samp{calcFunc-@var{func}} is
  271. Xused on the assumption that this is a to-be-defined math function.  Also, if
  272. Xthe function name is quoted as in @samp{('integerp a)} the function name is
  273. Xalways used exactly as written.@refill
  274. X
  275. XVariable names have @samp{var-} prepended to them unless they appear in
  276. Xthe function's argument list or in an enclosing @code{let}, @code{let*},
  277. X@code{for}, or @code{foreach} form,
  278. Xor their names already contain a @samp{-} character.  Thus a reference to
  279. X@samp{foo} is the same as a reference to @samp{var-foo}.@refill
  280. X
  281. XA few other Lisp extensions are available in @code{defmath} definitions:
  282. X
  283. X@itemize @bullet
  284. X@item
  285. XThe @code{elt} function accepts any number of index variables.
  286. XNote that Calc vectors are stored as Lisp lists whose first
  287. Xelement is the symbol @code{vec}; thus, @samp{(elt v 2)} yields
  288. Xthe second element of vector @code{v}, and @samp{(elt m i j)}
  289. Xyields one element of a Calc matrix.
  290. X
  291. X@item
  292. XThe @code{setq} function has been extended to act like the Common
  293. XLisp @code{setf} function.  (The name @code{setf} is recognized as
  294. Xa synonym of @code{setq}.)  Specifically, the first argument of
  295. X@code{setq} can be an @code{nth}, @code{elt}, @code{car}, or @code{cdr} form,
  296. Xin which case the effect is to store into the specified
  297. Xelement of a list.  Thus, @samp{(setq (elt m i j) x)} stores @code{x}
  298. Xinto one element of a matrix.
  299. X
  300. X@item
  301. XA @code{for} looping construct is available.  For example,
  302. X@samp{(for ((i 0 10)) body)} executes @code{body} once for each
  303. Xbinding of @code{i} from zero to 10.  This is like a @code{let}
  304. Xform in that @code{i} is temporarily bound to the loop count
  305. Xwithout disturbing its value outside the @code{for} construct.
  306. XNested loops, as in @samp{(for ((i 0 10) (j 0 (1- i) 2)) body)},
  307. Xare also available.  For each value of @code{i} from zero to 10,
  308. X@code{j} counts from 0 to @samp{i-1} in steps of two.  Note that
  309. X@code{for} has the same general outline as @code{let}, except
  310. Xthat each element of the header is a list of three or four
  311. Xthings, not just two.
  312. X
  313. X@item
  314. XThe @code{foreach} construct loops over elements of a list.
  315. XFor example, @samp{(foreach ((x (cdr v))) body)} executes
  316. X@code{body} with @code{x} bound to each element of Calc vector
  317. X@code{v} in turn.  The purpose of @code{cdr} here is to skip over
  318. Xthe initial @code{vec} symbol in the vector.
  319. X
  320. X@item
  321. XThe @code{break} function breaks out of the innermost enclosing
  322. X@code{while}, @code{for}, or @code{foreach} loop.  If given a
  323. Xvalue, as in @samp{(break x)}, this value is returned by the
  324. Xloop.  (Lisp loops otherwise always return @code{nil}.)
  325. X
  326. X@item
  327. XThe @code{return} function prematurely returns from the enclosing
  328. Xfunction.  For example, @samp{(return (+ x y))} returns @samp{x+y}
  329. Xas the value of a function.  You can use @code{return} anywhere
  330. Xinside the body of the function.
  331. X@end itemize
  332. X
  333. XNon-integer numbers (and extremely large integers) cannot be included
  334. Xdirectly into a @code{defmath} definition.  This is because the Lisp
  335. Xreader will fail to parse them long before @code{defmath} ever gets control.
  336. XInstead, use the notation, @samp{:"3.1415"}.  In fact, any algebraic
  337. Xformula can go between the quotes.  For example,
  338. X
  339. X@example
  340. X(defmath sqexp (x)     ; sqexp(x) == sqrt(exp(x)) == exp(x*0.5)
  341. X  (and (numberp x)
  342. X       (exp :"x * 0.5")))
  343. X@end example
  344. X
  345. Xexpands to
  346. X
  347. X@example
  348. X(defun calcFunc-sqexp (x)
  349. X  (and (math-numberp x)
  350. X       (calcFunc-exp (math-mul x '(float 5 -1)))))
  351. X@end example
  352. X
  353. XNote the use of @code{numberp} as a guard to ensure that the argument is
  354. Xa number first, returning @code{nil} if not.  The exponential function
  355. Xcould itself have been included in the expression, if we had preferred:
  356. X@samp{:"exp(x * 0.5)"}.  As another example, the multiplication-and-recursion
  357. Xstep of @code{myfact} could have been written
  358. X
  359. X@example
  360. X:"n * myfact(n-1)"
  361. X@end example
  362. X
  363. XIf a file named @file{.emacs} exists in your home directory, Emacs reads
  364. Xand executes the Lisp forms in this file as it starts up.  While it may
  365. Xseem like a good idea to put your favorite @code{defmath} commands here,
  366. Xthis has the unfortunate side-effect that the entire Calculator must be
  367. Xloaded in to process the @code{defmath} commands whether or not you will
  368. Xactually use the Calculator!  A better effect can be had by writing
  369. X
  370. X@example
  371. X(setq calc-defs '(
  372. X  (defmath ... )
  373. X  (defmath ... )
  374. X))
  375. X@end example
  376. X
  377. X@noindent
  378. X@vindex calc-defs
  379. XIf the @code{calc-defs} variable contains a list of Lisp expressions
  380. Xwhen the Calculator is started, those expressions will be executed and the
  381. X@code{calc-defs} variable cleared.  Thus your @code{defmath} commands will
  382. Xbe executed only once, and only when the Calculator is first used.  If you
  383. Xmust edit these definitions, simply re-execute the @code{setq} command
  384. Xusing @kbd{C-x C-e} and restart the Calculator with @kbd{M-x calc}.
  385. X
  386. X@node Defining Simple Commands, Defining Stack Commands, Defining Functions, Lisp Definitions
  387. X@subsection Defining New Simple Commands
  388. X
  389. X@findex interactive
  390. XIf a @code{defmath} form contains an @code{interactive} clause, it defines
  391. Xa Calculator command.  Actually such a @code{defmath} results in @emph{two}
  392. Xfunction definitions:  One, a @samp{calcFunc-} function as was just described,
  393. Xwith the @code{interactive} clause removed.  Two, a @samp{calc-} function
  394. Xwith a suitable @code{interactive} clause and some sort of wrapper to make
  395. Xthe command work in the Calc environment.
  396. X
  397. XIn the simple case, the @code{interactive} clause has the same form as
  398. Xfor normal Emacs Lisp commands:
  399. X
  400. X@example
  401. X(defmath increase-precision (delta)
  402. X  "Increase precision by DELTA."     ; This is the "documentation string"
  403. X  (interactive "p")                  ; Register this as a M-x-able command
  404. X  (setq calc-internal-prec (+ calc-internal-prec delta)))
  405. X@end example
  406. X
  407. XThis expands to the pair of definitions,
  408. X
  409. X@example
  410. X(defun calc-increase-precision (delta)
  411. X  "Increase precision by DELTA."
  412. X  (interactive "p")
  413. X  (calc-wrapper
  414. X   (setq calc-internal-prec (math-add calc-internal-prec delta))))
  415. X
  416. X(defun calcFunc-increase-precision (delta)
  417. X  "Increase precision by DELTA."
  418. X  (setq calc-internal-prec (math-add calc-internal-prec delta)))
  419. X@end example
  420. X
  421. X@noindent
  422. Xwhere in this case the latter function would never really be used!  Note
  423. Xthat since the Calculator stores small integers as plain Lisp integers,
  424. Xthe @code{math-add} function will work just as well as the native
  425. X@code{+} even when the intent is to operate on native Lisp integers.
  426. X
  427. X@findex calc-wrapper
  428. XThe @samp{calc-wrapper} call invokes a macro which surrounds the body of
  429. Xthe function with code that looks like this:
  430. X
  431. X@example
  432. X  (let ((calc-command-flags nil))
  433. X    (unwind-protect
  434. X        (progn
  435. X          (save-excursion
  436. X            (calc-select-buffer)
  437. X            @emph{body of function})
  438. X          (calc-finish-command))
  439. X      (calc-cleanup-command)))
  440. X@end example
  441. X
  442. X@findex calc-select-buffer
  443. XThe @code{calc-select-buffer} function selects the @samp{*Calculator*}
  444. Xbuffer if necessary, say, because the command was invoked from inside
  445. Xthe @samp{*Calc Trail*} window.
  446. X
  447. X@findex calc-finish-command
  448. XThe @code{calc-finish-command} function recomputes the line numbers
  449. Xfor all stack entries if they have been changed.
  450. XAlso, if the @code{clear-message} flag is set
  451. Xit executes @samp{(message "")} to clear any lingering ``Working'' message
  452. Xout of the echo area.@refill
  453. X
  454. X@findex calc-cleanup-command
  455. XThe @code{calc-cleanup-command} function normally aligns the stack window
  456. Xso that the top element of the stack is visible at the
  457. Xbottom of the window, and moves the cursor down to the bottom line.
  458. XThis can be suppressed by setting the @code{no-align}
  459. Xflag as described below.  Also, it clears the Inverse and Hyperbolic
  460. Xflags (unless the @code{keep-flags} flag has been set), and updates the
  461. Xdisplay of the mode line.@refill
  462. X
  463. X@findex calc-set-command-flag
  464. XYou can call, for example, @code{(calc-set-command-flag 'no-align)} to set
  465. Xthe above-mentioned command flags.
  466. X
  467. X@node Defining Stack Commands, Argument Qualifiers, Defining Simple Commands, Lisp Definitions
  468. X@subsection Defining New Stack-Based Commands
  469. X
  470. XTo define a new computational command which takes and/or leaves arguments
  471. Xon the stack, a special form of @code{interactive} clause is used.
  472. X
  473. X@example
  474. X(interactive @var{num} @var{tag})
  475. X@end example
  476. X
  477. X@noindent
  478. Xwhere @var{num} is an integer, and @var{tag} is a string.  The effect is
  479. Xto pop @var{num} values off the stack, resimplify them by calling
  480. X@code{calc-normalize}, and hand them to your function according to the
  481. Xfunction's argument list.  Your function may include @code{&optional} and
  482. X@code{&rest} parameters, so long as calling the function with @var{num}
  483. Xparameters is legal.
  484. X
  485. XYour function must return either a number or a formula in a form
  486. Xacceptable to Calc, or a list of such numbers or formulas.  These value(s)
  487. Xare pushed onto the stack when the function completes.  They are also
  488. Xrecorded in the Calc Trail buffer on a line beginning with @var{tag},
  489. Xa string of (normally) four characters or less.  If you omit @var{tag}
  490. Xor use @code{nil} as a tag, the result is not recorded in the trail.
  491. X
  492. XAs an example, the definition
  493. X
  494. X@example
  495. X(defmath myfact (n)
  496. X  "Compute the factorial of the integer at the top of the stack."
  497. X  (interactive 1 "fact")
  498. X  (if (> n 0)
  499. X      (* (myfact (1- n)))
  500. X    (and (= n 0) 1)))
  501. X@end example
  502. X
  503. X@noindent
  504. Xis a version of the factorial function shown previously which can be used
  505. Xas a command as well as an algebraic function.  It expands to
  506. X
  507. X@example
  508. X(defun calc-myfact ()
  509. X  "Compute the factorial of the integer at the top of the stack."
  510. X  (interactive)
  511. X  (calc-slow-wrapper
  512. X   (calc-enter-result 1 "fact"
  513. X     (cons 'calcFunc-myfact (calc-top-list-n 1)))))
  514. X
  515. X(defun calcFunc-myfact (n)
  516. X  "Compute the factorial of the integer at the top of the stack."
  517. X  (if (math-posp n)
  518. X      (math-mul n (calcFunc-myfact (math-add n -1)))
  519. X    (and (math-zerop n) 1)))
  520. X@end example
  521. X
  522. X@findex calc-slow-wrapper
  523. XThe @code{calc-slow-wrapper} function is a version of @code{calc-wrapper}
  524. Xthat automatically puts up a @samp{Working...} message before the
  525. Xcomputation begins.  (This message can be turned off by the user
  526. Xwith a @kbd{m w} (@code{calc-working}) command.)
  527. X
  528. X@findex calc-top-list-n
  529. XThe @code{calc-top-list-n} function returns a list of the specified number
  530. Xof values from the top of the stack.  It resimplifies each value by
  531. Xcalling @code{calc-normalize}.  If its argument is zero it returns an
  532. Xempty list.  It does not actually remove these values from the stack.
  533. X
  534. X@findex calc-enter-result
  535. XThe @code{calc-enter-result} function takes an integer @var{num} and string
  536. X@var{tag} as described above, plus a third argument which is either a
  537. XCalculator data object or a list of such objects.  These objects are
  538. Xresimplified and pushed onto the stack after popping the specified number
  539. Xof values from the stack.  If @var{tag} is non-@code{nil}, the values
  540. Xbeing pushed are also recorded in the trail.
  541. X
  542. XNote that if @code{calcFunc-myfact} returns @code{nil} this represents
  543. X``leave the function in symbolic form.''  To return an actual empty list,
  544. Xin the sense that @code{calc-enter-result} will push zero elements back
  545. Xonto the stack, you should return the special value @samp{'(nil)}, a list
  546. Xcontaining the single symbol @code{nil}.
  547. X
  548. XThe @code{interactive} declaration can actually contain a limited
  549. XEmacs-style code string as well which comes just before @var{num} and
  550. X@var{tag}.  Currently only Emacs code supported is @samp{"p"}, as in
  551. X
  552. X@example
  553. X(defmath foo (a b &optional c)
  554. X  (interactive "p" 2 "foo")
  555. X  @var{body})
  556. X@end example
  557. X
  558. XIn this example, the command @code{calc-foo} will evaluate the expression
  559. X@samp{foo(a,b)} if executed with no argument, or @samp{foo(a,b,n)} if
  560. Xexecuted with a numeric prefix argument of @samp{n}.
  561. X
  562. XThe other code string allowed is @samp{"m"} (unrelated to the usual @samp{"m"}
  563. Xcode as used with @code{defun}).  It uses the numeric prefix argument as the
  564. Xnumber of objects to remove from the stack and pass to the function.
  565. XIn this case, the integer @var{num} serves as a default number of
  566. Xarguments to be used when no prefix is supplied.
  567. X
  568. X@node Argument Qualifiers, Example Definitions, Defining Stack Commands, Lisp Definitions
  569. X@subsection Argument Qualifiers
  570. X
  571. XAnywhere a parameter name can appear in the parameter list you can also use
  572. Xan @dfn{argument qualifier}.  Thus the general form of a definition is:
  573. X
  574. X@example
  575. X(defmath @var{name} (@var{param} @var{param...}
  576. X               &optional @var{param} @var{param...}
  577. X               &rest @var{param})
  578. X  @var{body})
  579. X@end example
  580. X
  581. Xwhere each @var{param} is either a symbol or a list of the form
  582. X
  583. X@example
  584. X(@var{qual} @var{param})
  585. X@end example
  586. X
  587. XThe following qualifiers are recognized:
  588. X
  589. X@table @samp
  590. X@item complete
  591. X@findex complete
  592. XThe argument must not be an incomplete vector, interval, or complex number.
  593. X(This is rarely needed since the Calculator itself will never call your
  594. Xfunction with an incomplete argument.  But there is nothing stopping your
  595. Xown Lisp code from calling your function with an incomplete argument.)@refill
  596. X
  597. X@item integer
  598. X@findex integer
  599. XThe argument must be an integer.  If it is an integer-valued float
  600. Xit will be accepted but converted to integer form.  Non-integers and
  601. Xformulas are rejected.
  602. X
  603. X@item natnum
  604. X@findex natnum
  605. XLike @samp{integer}, but the argument must be non-negative.
  606. X
  607. X@item fixnum
  608. X@findex fixnum
  609. XLike @samp{integer}, but the argument must fit into a native Lisp integer,
  610. Xwhich on most systems means less than 2^23 in absolute value.  The
  611. Xargument is converted into Lisp-integer form if necessary.
  612. X
  613. X@item float
  614. X@findex float
  615. XThe argument is converted to floating-point format if it is a number or
  616. Xvector.  If it is a formula it is left alone.  (The argument is never
  617. Xactually rejected by this qualifier.)
  618. X
  619. X@item @var{pred}
  620. XThe argument must satisfy predicate @var{pred}, which is one of the
  621. Xstandard Calculator predicates.  @xref{Predicates}.
  622. X
  623. X@item not-@var{pred}
  624. XThe argument must @emph{not} satisfy predicate @var{pred}.
  625. X@end table
  626. X
  627. XFor example,
  628. X
  629. X@example
  630. X(defmath foo (a (constp (not-matrixp b)) &optional (float c)
  631. X              &rest (integer d))
  632. X  @var{body})
  633. X@end example
  634. X
  635. X@noindent
  636. Xexpands to
  637. X
  638. X@example
  639. X(defun calcFunc-foo (a b &optional c &rest d)
  640. X  (and (math-matrixp b)
  641. X       (math-reject-arg b 'not-matrixp))
  642. X  (or (math-constp b)
  643. X      (math-reject-arg b 'constp))
  644. X  (and c (setq c (math-check-float c)))
  645. X  (setq d (mapcar 'math-check-integer d))
  646. X  @var{body})
  647. X@end example
  648. X
  649. X@noindent
  650. Xwhich performs the necessary checks and conversions before executing the
  651. Xbody of the function.
  652. X
  653. X@node Example Definitions, Internals, Argument Qualifiers, Lisp Definitions
  654. X@subsection Example Definitions
  655. X
  656. XThis section includes some Lisp programming examples on a larger scale.
  657. XThese programs make use of many of the Calculator's internal functions
  658. X(@pxref{Internals}).
  659. X
  660. X@menu
  661. X* Sine Example::
  662. X@end menu
  663. X
  664. X@node Sine Example, , Example Definitions, Example Definitions
  665. X@subsubsection The Sine Function
  666. X
  667. XA somewhat limited sine function could be defined as follows, using the
  668. Xwell-known Taylor series expansion for @samp{sin(x)}:
  669. X
  670. X@example
  671. X(defmath mysin ((float (anglep x)))
  672. X  (interactive 1 "mysn")
  673. X  (setq x (to-radians x))    ; Convert from current angular mode.
  674. X  (let ((sum x)              ; Initial term of Taylor expansion of sin.
  675. X        newsum
  676. X        (nfact 1)            ; "nfact" equals "n" factorial at all times.
  677. X        (xnegsqr :"-(x^2)")) ; "xnegsqr" equals -x^2.
  678. X    (for ((n 3 100 2))       ; Upper limit of 100 is a good precaution.
  679. X         (working "mysin" sum)   ; Display "Working" message, if enabled.
  680. X         (setq nfact (* nfact (1- n) n)
  681. X               x (* x xnegsqr)
  682. X               newsum (+ sum (/ x nfact)))
  683. X         (if (~= newsum sum)     ; If newsum is "nearly equal to" sum,
  684. X             (break))            ;  then we are done.
  685. X         (setq sum newsum))
  686. X    sum))
  687. X@end example
  688. X
  689. XThe actual @code{sin} function in Calc works by first reducing the problem
  690. Xto a sine or cosine of a nonnegative number less than @samp{pi/4}.  This
  691. Xensures that the Taylor series will converge quickly.  Also, the calculation
  692. Xis carried out with two extra digits of precision to guard against cumulative
  693. Xround-off in @samp{sum}.  Finally, complex arguments are allowed and handled
  694. Xby a separate algorithm.
  695. X
  696. X@example
  697. X(defmath mysin ((float (scalarp x)))
  698. X  (interactive 1 "mysn")
  699. X  (setq x (to-radians x))    ; Convert from current angular mode.
  700. X  (with-extra-prec 2         ; Evaluate with extra precision.
  701. X    (cond ((complexp x)
  702. X           (mysin-complex x))
  703. X          ((< x 0)
  704. X           (- (mysin-raw (- x)))    ; Always call mysin-raw with x >= 0.
  705. X          (t (mysin-raw x))))))
  706. X
  707. X(defmath mysin-raw (x)
  708. X  (cond ((>= x 7)
  709. X         (mysin-raw (% x (two-pi))))     ; Now x < 7.
  710. X        ((> x (pi-over-2))
  711. X         (- (mysin-raw (- x (pi)))))     ; Now -pi/2 <= x <= pi/2.
  712. X        ((> x (pi-over-4))
  713. X         (mycos-raw (- x (pi-over-2))))  ; Now -pi/2 <= x <= pi/4.
  714. X        ((< x (- (pi-over-4)))
  715. X         (- (mycos-raw (+ x (pi-over-2)))))  ; Now -pi/4 <= x <= pi/4,
  716. X        (t (mysin-series x))))           ; so the series will be efficient.
  717. X@end example
  718. X
  719. X@noindent
  720. Xwhere @code{mysin-complex} is an appropriate function to handle complex
  721. Xnumbers, @code{mysin-series} is the routine to compute the sine Taylor
  722. Xseries as before, and @code{mycos-raw} is a function analogous to
  723. X@code{mysin-raw} for cosines.
  724. X
  725. XThe strategy is to ensure that @samp{x} is nonnegative before calling
  726. X@code{mysin-raw}.  This function then recursively reduces its argument
  727. Xto a suitable range, namely, plus-or-minus @samp{pi/4}.  Note that each
  728. Xtest, and particularly the first comparison against 7, is designed so
  729. Xthat small roundoff errors cannnot produce an infinite loop.  (Suppose
  730. Xwe compared with @samp{(two-pi)} instead; if due to roundoff problems
  731. Xthe modulo operator ever returned @samp{(two-pi)} exactly, an infinite
  732. Xrecursion could result!)  We use modulo only for arguments that will
  733. Xclearly get reduced, knowing that the next rule will catch any reductions
  734. Xthat this rule misses.
  735. X
  736. XIf a program is being written for general use, it is important to code
  737. Xit carefully as shown in this second example.  For quick-and-dirty programs,
  738. Xwhen you know that your own use of the sine function will never encounter
  739. Xa large argument, a simpler program like the first one shown is fine.
  740. X
  741. X@node Internals, , Example Definitions, Lisp Definitions
  742. X@subsection Calculator Internals
  743. X
  744. XThis chapter describes the Lisp functions defined by the Calculator that
  745. Xmay be of use to user-written Calculator programs (as described in the
  746. Xrest of this chapter).  These functions are shown by their names as they
  747. Xconventionally appear in @code{defmath}.  Their full Lisp names are
  748. Xgenerally gotten by prepending @samp{calcFunc-} or @samp{math-} to their
  749. Xapparent names.  (Names that begin with @samp{calc-} are already in
  750. Xtheir full Lisp form.)  You can use the actual full names instead if you
  751. Xprefer them, or if you are calling these functions from regular Lisp.
  752. X
  753. XLittle distinction is made here between functions in the main Calc
  754. Xbody and functions in the extensions module.  Because @code{defmath}
  755. Xitself is in the extensions, user-written code generally always
  756. Xexecutes with the extensions already loaded, so this is not an issue.
  757. XIf you are doing something special, check carefully to make sure each
  758. Xfunction you are using is from the main body; be sure to call
  759. X@samp{(calc-extensions)} before using any function from the extensions
  760. Xpackage if you can't prove the extensions will already have been loaded.
  761. X
  762. X@menu
  763. X* Data Type Formats::
  764. X* Interactive Lisp Functions::
  765. X* Stack Lisp Functions::
  766. X* Predicates::
  767. X* Computational Lisp Functions::
  768. X* Vector Lisp Functions::
  769. X* Symbolic Lisp Functions::
  770. X* Formatting Lisp Functions::
  771. X* Lisp Variables::
  772. X* Hooks::
  773. X@end menu
  774. X
  775. X@node Data Type Formats, Interactive Lisp Functions, Internals, Internals
  776. X@subsubsection Data Type Formats
  777. X
  778. XIntegers are stored in either of two ways, depending on their magnitude.
  779. XIntegers less than one million in absolute value are stored as standard
  780. XLisp integers.  This is the only storage format for Calc data objects
  781. Xwhich is not a Lisp list.
  782. X
  783. XLarge integers are stored as a list of the form @samp{(bigpos @var{d0}
  784. X@var{d1} @var{d2} @dots{}} for positive integers 1000000 or more, or
  785. X@samp{(bigneg @var{d0} @var{d1} @var{d2} @dots{}} for negative integers
  786. X-1000000 or less.  Each @var{d} is a base-1000 ``digit,'' a Lisp integer
  787. Xfrom 0 to 999.  The least significant digit is @var{d0}; the last digit,
  788. X@var{dn}, which is always nonzero, is the most significant digit.  For
  789. Xexample, the integer -12345678 is stored as @samp{(bigneg 678 345 12)}.
  790. X
  791. XThe distinction between small and large integers is entirely hidden from
  792. Xthe user.  In @code{defmath} definitions, the Lisp predicate @code{integerp}
  793. Xreturns true for either kind of integer, and in general both big and small
  794. Xintegers are accepted anywhere the word ``integer'' is used in this manual.
  795. XIf the distinction must be made, native Lisp integers are called @dfn{fixnums}
  796. Xand large integers are called @dfn{bignums}.
  797. X
  798. XFractions are stored as a list of the form, @samp{(frac @var{n} @var{d})}
  799. Xwhere @var{n} is an integer (big or small) numerator, @var{d} is an
  800. Xinteger denominator greater than one, and @var{n} and @var{d} are relatively
  801. Xprime.  Note that fractions where @var{d} is one are automatically converted
  802. Xto plain integers by all math routines; fractions where @var{d} is negative
  803. Xare normalized by negating the numerator and denominator.
  804. X
  805. XFloating-point numbers are stored in the form, @samp{(float @var{mant}
  806. X@var{exp})}, where @var{mant} (the ``mantissa'') is an integer less than
  807. X@samp{10^@var{p}} in absolute value (@var{p} represents the current
  808. Xprecision), and @var{exp} (the ``exponent'') is a fixnum.  The value of
  809. Xthe float is @samp{@var{mant} * 10^@var{exp}}.  For example, the number
  810. X-3.14 is stored as @samp{(float -314 -2) = -314*10^-2}.  Other constraints
  811. Xare that the number 0.0 is always stored as @samp{(float 0 0)}, and,
  812. Xexcept for the 0.0 case, the rightmost base-10 digit of @var{mant} is
  813. Xalways nonzero.  (If the rightmost digit is zero, the number is
  814. Xrearranged by dividing @var{mant} by ten and incrementing @var{exp}.)@refill
  815. X
  816. XRectangular complex numbers are stored in the form @samp{(cplx @var{re}
  817. X@var{im})}, where @var{re} and @var{im} are each real numbers, either
  818. Xintegers, fractions, or floats.  The value is @samp{@var{re} + @var{im}i}.
  819. XThe @var{im} part is nonzero; complex numbers with zero imaginary
  820. Xcomponents are converted to real numbers automatically.@refill
  821. X
  822. XPolar complex numbers are stored in the form @samp{(polar @var{r}
  823. X@var{theta})}, where @var{r} is a positive real value and @var{theta}
  824. Xis a real value or HMS form representing an angle.  This angle is
  825. Xusually normalized to lie in the interval @samp{(-180 .. 180)} degrees,
  826. Xor @samp{(-pi .. pi)} radians, according to the current angular mode.
  827. XIf the angle is 0 the value is converted to a real number automatically.
  828. X(If the angle is 180 degrees, the value is usually also converted to a
  829. Xnegative real number.)@refill
  830. X
  831. XHours-minutes-seconds forms are stored as @samp{(hms @var{h} @var{m}
  832. X@var{s})}, where @var{h} is an integer or an integer-valued float (i.e.,
  833. Xa float with @samp{@var{exp} >= 0}), @var{m} is an integer or integer-valued
  834. Xfloat in the range @samp{[0 .. 60)}, and @var{s} is any real number in the
  835. Xrange @samp{[0 .. 60)}.@refill
  836. X
  837. XModulo forms are stored as @samp{(mod @var{n} @var{m})}, where @var{m} is a
  838. Xpositive real number or HMS form, and @var{n} is a real number or HMS
  839. Xform in the range @samp{[0 .. @var{m})}.
  840. X
  841. XError forms are stored as @samp{(sdev @var{x} @var{sigma})}, where @var{x}
  842. Xis the mean value and @var{sigma} is the standard deviation.  Each
  843. Xcomponent is either a real number, an HMS form, or a symbolic object
  844. X(a variable or function call).  If @var{sigma} is zero, the value is
  845. Xconverted to a plain real number.  If @var{sigma} is negative, it is
  846. Xautomatically normalized to be positive.
  847. X
  848. XInterval forms are stored as @samp{(intv @var{mask} @var{lo} @var{hi})},
  849. Xwhere @var{mask} is one of the integers 0, 1, 2, or 3, and @var{lo} and
  850. X@var{hi} are real numbers, HMS forms, or symbolic objects.  The @var{mask}
  851. Xis a binary integer where 1 represents the fact that the interval is
  852. Xclosed on the high end, and 2 represents the fact that it is closed on
  853. Xthe low end.  (Thus 3 represents a fully closed interval.)  The interval
  854. X@samp{(intv 3 @var{x} @var{x})} is converted to the plain number @var{x};
  855. Xintervals @samp{(intv @var{mask} @var{x} @var{x})} for any other @var{mask}
  856. Xrepresent empty intervals.  If @var{hi} is less than @var{lo}, the interval
  857. Xis converted to a standard empty interval by replacing @var{hi} with @var{lo}.
  858. X
  859. XVectors are stored as @samp{(vec @var{v1} @var{v2} @dots{})}, where @var{v1}
  860. Xis the first element of the vector, @var{v2} is the second, and so on.
  861. XAn empty vector is stored as @samp{(vec)}.  A matrix is simply a vector
  862. Xwhere all @var{v}'s are themselves vectors of equal lengths.
  863. X
  864. XVariables are stored as @samp{(var @var{name} @var{sym})}, where
  865. X@var{name} is a Lisp symbol whose print name is used as the visible name
  866. Xof the variable, and @var{sym} is a Lisp symbol in which the variable's
  867. Xvalue is actually stored.  Thus, @samp{(var pi var-pi)} represents the
  868. Xspecial constant @samp{pi}.  Almost always, the form is @samp{(var
  869. X@var{v} var-@var{v})}.  If the variable name was entered with
  870. Xunderscores (which are converted to hyphens internally), the form is
  871. X@samp{(var @var{v} @var{v})}.  The value of a variable is the Calc
  872. Xobject stored in its @var{sym} symbol's value cell.  If the symbol's
  873. Xvalue cell is void or if it contains @code{nil}, the variable has no
  874. Xvalue.  Special constants have the form @samp{(special-const
  875. X@var{value})} stored in their value cell, where @var{value} is a formula
  876. Xwhich is evaluated when the constant's value is requested.  Variables
  877. Xwhich represent units are not stored in any special way; they are units
  878. Xonly because their names appear in the units table.@refill
  879. X
  880. XA Lisp list with any other symbol as the first element is a function call.
  881. XThe symbols @code{+}, @code{-}, @code{*}, @code{/}, @code{%}, @code{^},
  882. Xand @code{|} represent special binary operators; these lists are always
  883. Xof the form @samp{(@var{op} @var{lhs} @var{rhs})} where @var{lhs} is the
  884. Xsub-formula on the lefthand side and @var{rhs} is the sub-formula on the
  885. Xright.  The symbol @code{neg} represents unary negation; this list is always
  886. Xof the form @samp{(neg @var{arg})}.  Any other symbol @var{func} represents a
  887. Xfunction that would be displayed in function-call notation; the symbol
  888. X@var{func} is in general always of the form @samp{calcFunc-@var{name}}.
  889. XThe function cell of the symbol @var{func} should contain a Lisp function
  890. Xfor evaluating a call to @var{func}.  This function is passed the remaining
  891. Xelements of the list (themselves already evaluated) as arguments; such
  892. Xfunctions should return @code{nil} or call @code{reject-arg} to signify
  893. Xthat they should be left in symbolic form, or they should return a Calc
  894. Xobject which represents their value, or a list of such objects if they
  895. Xwish to return multiple values.  (The latter case is allowed only for
  896. Xfunctions which are the outer-level call in an expression whose value is
  897. Xabout to be pushed on the stack.)@refill
  898. X
  899. X@node Interactive Lisp Functions, Stack Lisp Functions, Data Type Formats, Internals
  900. X@subsubsection Interactive Functions
  901. X
  902. XThe functions described here are used in implementing interactive Calc
  903. Xcommands.
  904. X
  905. X@defun calc-set-command-flag flag
  906. XSet the command flag @var{flag}.  This is generally a Lisp symbol, but
  907. Xmay in fact by anything.  The effect is to add @var{flag} to the list
  908. Xstored in the variable @code{calc-command-flags}, unless it is already
  909. Xthere.  @xref{Defining Simple Commands}.
  910. X@end defun
  911. X
  912. X@defun calc-clear-command-flag flag
  913. XIf @var{flag} appears among the list of currently-set command flags,
  914. Xremove it from that list.
  915. X@end defun
  916. X
  917. X@defun calc-record-undo rec
  918. XAdd the ``undo record'' @var{rec} to the list of steps to take if the
  919. Xcurrent operation should need to be undone.  Stack push and pop functions
  920. Xautomatically call @code{calc-record-undo}, so the kinds of undo records
  921. Xyou might need to create take the form @samp{(set @var{sym} @var{value})},
  922. Xwhich says that the Lisp variable @var{sym} was changed and had previously
  923. Xcontained @var{value}; @samp{(store @var{var} @var{value})} which says that
  924. Xthe Calc variable @var{var} (a string which is the name of the symbol that
  925. Xcontains the variable's value) was stored and its previous value was
  926. X@var{value} (either a Calc data object, or @var{nil} if the variable was
  927. Xpreviously void); or @samp{(eval @var{undo} @var{redo} @var{args} @dots{})},
  928. Xwhich means that to undo requires calling the function @samp{(@var{undo}
  929. X@var{args} @dots{})} and, if the undo is later redone, calling
  930. X@samp{(@var{redo} @var{args} @dots{})}.@refill
  931. X@end defun
  932. X
  933. X@defun calc-record-why msg args
  934. XRecord the error or warning message @var{msg}, which is normally a string.
  935. XThis message will be replayed if the user types @kbd{w} (@code{calc-why});
  936. Xthe first such message recorded for a command will be replayed automatically
  937. Xif the user has turned on @code{calc-auto-why} mode.  If one or more
  938. X@var{args} are present, the displayed message will be of the form,
  939. X@samp{@var{msg}: @var{arg1}, @var{arg2}, @dots{}}, where the arguments are
  940. Xformatted on the assumption that they are either strings or Calc objects of
  941. Xsome sort.  If @var{msg} is a symbol, it is the name of a Calc predicate
  942. X(such as @code{integerp} or @code{numvecp}) which the arguments did not
  943. Xsatisfy; it is expanded to a suitable string such as ``Expected an
  944. Xinteger.''  The @code{reject-arg} function calls @code{calc-record-why}
  945. Xautomatically; @pxref{Predicates}.@refill
  946. X@end defun
  947. X
  948. X@defun calc-is-inverse
  949. XThis predicate returns true if the current command is inverse,
  950. Xi.e., if the Inverse (@kbd{I} key) flag was set.
  951. X@end defun
  952. X
  953. X@defun calc-is-hyperbolic
  954. XThis predicate is the analogous function for the @kbd{H} key.
  955. X@end defun
  956. X
  957. X@node Stack Lisp Functions, Predicates, Interactive Lisp Functions, Internals
  958. X@subsubsection Stack-Oriented Functions
  959. X
  960. XThe functions described here perform various operations on the Calc
  961. Xstack and trail.  They are to be used in interactive Calc commands.
  962. X
  963. X@defun calc-push-list vals n
  964. XPush the Calc objects in list @var{vals} onto the stack at stack level
  965. X@var{n}.  If @var{n} is omitted it defaults to 1, so that the elements
  966. Xare pushed at the top of the stack.  If @var{n} is greater than 1, the
  967. Xelements will be inserted into the stack so that the last element will
  968. Xend up at level @var{n}, the next-to-last at level @var{n}+1, etc.
  969. XThe elements of @var{vals} are assumed to be valid Calc objects, and
  970. Xare not evaluated or renormalized in any way.  If @var{vals} is an
  971. Xempty list, nothing happens.@refill
  972. X@end defun
  973. X
  974. X@defun calc-top-list n m
  975. XReturn a list of the @var{n} objects starting at level @var{m} of the
  976. Xstack.  If @var{m} is omitted it defaults to 1, so that the elements are
  977. Xtaken from the top of the stack.  If @var{n} is omitted, it also
  978. Xdefaults to 1, so that the top stack element (in the form of a
  979. Xone-element list) is returned.  If @var{m} is greater than 1, the
  980. X@var{m}th stack element will be at the end of the list, the @var{m}+1st
  981. Xelement will be next-to-last, etc.  If @var{n} or @var{m} are out of
  982. Xrange, the command is aborted with a suitable error message.  If @var{n}
  983. Xis zero, the function returns an empty list.  The stack elements are not
  984. Xevaluated or renormalized.@refill
  985. X@end defun
  986. X
  987. X@defun calc-pop-stack n m
  988. XRemove the specified elements from the stack.  The parameters @var{n}
  989. Xand @var{m} are defined the same as for @code{calc-top-list}.  The return
  990. Xvalue of @code{calc-pop-stack} is uninteresting.
  991. X@end defun
  992. X
  993. X@defun calc-record-list vals tag
  994. XThis function records one or more results in the trail.  The @var{vals}
  995. Xare a list of strings or Calc objects.  The @var{tag} is the four-character
  996. Xtag string to identify the values.  If @var{tag} is omitted, a blank tag
  997. Xwill be used.
  998. X@end defun
  999. X
  1000. X@defun calc-normalize n
  1001. XThis function takes a Calc object and ``normalizes'' it.  At the very
  1002. Xleast this involves re-rounding floating-point values according to the
  1003. Xcurrent precision and other similar jobs.  Also, unless the user has
  1004. Xselected no-simplify mode (@pxref{Simplification Modes}), this involves
  1005. Xactually evaluating a formula object by executing the function calls
  1006. Xit contains.
  1007. X@end defun
  1008. X
  1009. X@defun calc-top-list-n n m
  1010. XThis function is identical to @code{calc-top-list}, except that it calls
  1011. X@code{calc-normalize} on the values that it takes from the stack.  They
  1012. Xare also passed through @code{check-complete}, so that incomplete
  1013. Xobjects will be rejected with an error message.  All computational
  1014. Xcommands should use this in preference to @code{calc-top-list}; the only
  1015. Xstandard Calc commands that operate on the stack without normalizing
  1016. Xare stack management commands like @code{calc-enter} and @code{calc-roll-up}.
  1017. X@end defun
  1018. X
  1019. X@defun calc-top-n m
  1020. XThis function is a convenient form of @code{calc-top-list-n} in which only
  1021. Xa single element of the stack is taken and returned, rather than a list
  1022. Xof elements.
  1023. X@end defun
  1024. X
  1025. X@defun calc-enter-result n tag vals
  1026. XThis function is a convenient interface to most of the above functions.
  1027. XThe @var{vals} argument should be either a single Calc object, or a list
  1028. Xof Calc objects; the object or objects are normalized, and the top @var{n}
  1029. Xstack entries are replaced by the normalized objects.  If @var{tag} is
  1030. Xnon-@code{nil}, the normalized objects are also recorded in the trail.
  1031. XA typical stack-based computational command would take the form,
  1032. X
  1033. X@example
  1034. X(calc-enter-result @var{n} @var{tag} (cons 'calcFunc-@var{func}
  1035. X                               (calc-top-list-n @var{n})))
  1036. X@end example
  1037. X@end defun
  1038. X
  1039. X@defun calc-unary-op tag func arg
  1040. XThis function implements a unary operator that allows a numeric prefix
  1041. Xargument to apply the operator over many stack entries.  If the prefix
  1042. Xargument @var{arg} is @code{nil}, this uses @code{calc-enter-result}
  1043. Xas outlined above.  Otherwise, it maps the function over several stack
  1044. Xelements; @pxref{Prefix Arguments}.  For example,@refill
  1045. X
  1046. X@example
  1047. X(defun calc-zeta (arg)
  1048. X  (interactive "P")
  1049. X  (calc-unary-op "zeta" 'calcFunc-zeta arg))
  1050. X@end example
  1051. X@end defun
  1052. X
  1053. X@defun calc-binary-op tag func arg ident unary
  1054. XThis function implements a binary operator, analogously to
  1055. X@code{calc-unary-op}.  The optional @var{ident} and @var{unary}
  1056. Xarguments specify the behavior when the prefix argument is zero or
  1057. Xone, respectively.  If the argument is zero, the value @var{ident}
  1058. Xis pushed onto the stack, if specified, otherwise an error message
  1059. Xis displayed.  If the argument is one, the unary function @var{unary}
  1060. Xis applied to the top stack element, or, if @var{unary} is not
  1061. Xspecified, nothing happens.  When the argument is two or more,
  1062. Xthe binary function @var{func} is reduced across the top @var{arg}
  1063. Xstack elements; when the argument is negative, the function is
  1064. Xmapped between the next-to-top -@var{arg} stack elements and the
  1065. Xtop element.@refill
  1066. X@end defun
  1067. X
  1068. X@defun calc-stack-size
  1069. XReturn the number of elements on the stack as an integer.  This count
  1070. Xdoes not include elements that have been temporarily hidden by stack
  1071. Xtruncation; @pxref{Truncating the Stack}.
  1072. X@end defun
  1073. X
  1074. X@defun calc-cursor-stack-index n
  1075. XMove the point to the @var{n}th stack entry.  If @var{n} is zero, this
  1076. Xwill be the @samp{.} line.  If @var{n} is from 1 to the current stack size,
  1077. Xthis will be the beginning of the first line of that stack entry's display.
  1078. XIf line numbers are enabled, this will move to the first character of the
  1079. Xline number, not the stack entry itself.@refill
  1080. X@end defun
  1081. X
  1082. X@defun calc-substack-height n
  1083. XReturn the number of lines between the beginning of the @var{n}th stack
  1084. Xentry and the bottom of the buffer.  If @var{n} is zero, this
  1085. Xwill be one (assuming no stack truncation).  If all stack entries are
  1086. Xone line long (i.e., no matrices are displayed), the return value will
  1087. Xbe equal @var{n}+1 as long as @var{n} is in range.@refill
  1088. X@end defun
  1089. X
  1090. X@defun calc-refresh
  1091. XErase the @code{*Calculator*} buffer and reformat its contents from memory.
  1092. XThis must be called after changing any parameter, such as the current
  1093. Xdisplay radix, which might change the appearance of existing stack
  1094. Xentries.  (During a keyboard macro invoked by the @kbd{K} key, refreshing
  1095. Xis suppressed, but a flag is set so that the entire stack will be refreshed
  1096. Xrather than just the top few elements when the macro finishes.)@refill
  1097. X@end defun
  1098. X
  1099. X@node Predicates, Computational Lisp Functions, Stack Lisp Functions, Internals
  1100. X@subsubsection Predicates
  1101. X
  1102. XThe functions described here are predicates, that is, they return a
  1103. Xtrue/false value where @code{nil} means false and anything else means
  1104. Xtrue.  These predicates are expanded by @code{defmath}, for example,
  1105. Xfrom @code{zerop} to @code{math-zerop}.  In many cases they correspond
  1106. Xto native Lisp functions by the same name, but are extended to cover
  1107. Xthe full range of Calc data types.
  1108. X
  1109. X@defun zerop x
  1110. XReturns true if @var{x} is numerically zero, in any of the Calc data
  1111. Xtypes.  (Note that for some types, such as error forms and intervals,
  1112. Xit never makes sense to return true.)  In @code{defmath}, the expression
  1113. X@samp{(= x 0)} will automatically be converted to @samp{(math-zerop x)},
  1114. Xand @samp{(/= x 0)} will be converted to @samp{(not (math-zerop x))}.
  1115. X@end defun
  1116. X
  1117. X@defun negp x
  1118. XReturns true if @var{x} is negative.  This accepts negative real numbers
  1119. Xof various types, negative HMS forms, and intervals in which all
  1120. Xincluded values are negative.  In @code{defmath}, the expression
  1121. X@samp{(< x 0)} will automatically be converted to @samp{(math-negp x)},
  1122. Xand @samp{(>= x 0)} will be converted to samp{(not (math-negp x))}.
  1123. X@end defun
  1124. X
  1125. X@defun posp x
  1126. XReturns true if @var{x} is positive (and non-zero).
  1127. X@end defun
  1128. X
  1129. X@defun looks-negp x
  1130. XReturns true if @var{x} is ``negative-looking.''  This returns true if
  1131. X@var{x} is a negative number, or a formula with a leading minus sign
  1132. Xsuch as @samp{-a/b}.  In other words, this is an object which can be
  1133. Xmade simpler by calling @code{(- @var{x})}.
  1134. X@end defun
  1135. X
  1136. X@defun integerp x
  1137. XReturns true if @var{x} is an integer of any size.
  1138. X@end defun
  1139. X
  1140. X@defun fixnump x
  1141. XReturns true if @var{x} is a native Lisp integer.
  1142. X@end defun
  1143. X
  1144. X@defun natnump x
  1145. XReturns true if @var{x} is a nonnegative integer of any size.
  1146. X@end defun
  1147. X
  1148. X@defun fixnatnump x
  1149. XReturns true if @var{x} is a nonnegative Lisp integer.
  1150. X@end defun
  1151. X
  1152. X@defun num-integerp x
  1153. XReturns true if @var{x} is numerically an integer, i.e., either a
  1154. Xtrue integer or a float with no significant digits to the right of
  1155. Xthe decimal point.
  1156. X@end defun
  1157. X
  1158. X@defun messy-integerp x
  1159. XReturns true if @var{x} is numerically, but not literally, an integer.
  1160. XA value is @code{num-integerp} if it is @code{integerp} or
  1161. X@code{messy-integerp} (but it is never both at once).
  1162. X@end defun
  1163. X
  1164. X@defun num-natnump x
  1165. XReturns true if @var{x} is numerically a nonnegative integer.
  1166. X@end defun
  1167. X
  1168. X@defun evenp x
  1169. XReturns true if @var{x} is an even integer.
  1170. X@end defun
  1171. X
  1172. X@defun looks-evenp x
  1173. XReturns true if @var{x} is an even integer, or a formula with a leading
  1174. Xmultiplicative coefficient which is an even integer.
  1175. X@end defun
  1176. X
  1177. X@defun oddp x
  1178. XReturns true if @var{x} is an odd integer.
  1179. X@end defun
  1180. X
  1181. X@defun provably-integerp x
  1182. XReturns true if @var{x} is an integer, or a formula whose result
  1183. Xis guaranteed to be an integer (such as a call to @code{floor}).
  1184. X@end defun
  1185. X
  1186. X@defun ratp x
  1187. XReturns true if @var{x} is a rational number, i.e., an integer or a
  1188. Xfraction.
  1189. X@end defun
  1190. X
  1191. X@defun realp x
  1192. XReturns true if @var{x} is a real number, i.e., an integer, fraction,
  1193. Xor floating-point number.
  1194. X@end defun
  1195. X
  1196. X@defun provably-realp x
  1197. XReturns true if @var{x} is a real number, or a formula whose result
  1198. Xis guaranteed to be real (such as a call to @code{abs}).
  1199. X@end defun
  1200. X
  1201. X@defun anglep x
  1202. XReturns true if @var{x} is a real number or HMS form.
  1203. X@end defun
  1204. X
  1205. X@defun floatp x
  1206. XReturns true if @var{x} is a float, or a complex number, error form,
  1207. Xinterval, or modulo form in which at least one component is a float.
  1208. X@end defun
  1209. X
  1210. X@defun complexp x
  1211. XReturns true if @var{x} is a rectangular or polar complex number
  1212. X(but not a real number).
  1213. X@end defun
  1214. X
  1215. X@defun rect-complexp x
  1216. XReturns true if @var{x} is a rectangular complex number.
  1217. X@end defun
  1218. X
  1219. X@defun polar-complexp x
  1220. XReturns true if @var{x} is a polar complex number.
  1221. X@end defun
  1222. X
  1223. X@defun numberp x
  1224. XReturns true if @var{x} is a real number or a complex number.
  1225. X@end defun
  1226. X
  1227. X@defun scalarp x
  1228. XReturns true if @var{x} is a real or complex number or an HMS form.
  1229. X@end defun
  1230. X
  1231. X@defun vectorp x
  1232. XReturns true if @var{x} is a vector (this simply checks if its argument
  1233. Xis a list whose first element is the symbol @code{vec}).
  1234. X@end defun
  1235. X
  1236. X@defun numvecp x
  1237. XReturns true if @var{x} is a number or vector.
  1238. X@end defun
  1239. X
  1240. X@defun matrixp x
  1241. XReturns true if @var{x} is a matrix, i.e., a vector of one or more vectors,
  1242. Xall of the same size.
  1243. X@end defun
  1244. X
  1245. X@defun square-matrixp x
  1246. XReturns true if @var{x} is a square matrix.
  1247. X@end defun
  1248. X
  1249. X@defun objectp x
  1250. XReturns true if @var{x} is any numeric Calc object, including real and
  1251. Xcomplex numbers, HMS forms, error forms, intervals, and modulo forms.
  1252. X(Note that error forms and intervals may include formulas as their
  1253. Xcomponents; see @code{constp} below.)
  1254. X@end defun
  1255. X
  1256. X@defun real-objectp x
  1257. XReturns true if @var{x} is any numeric Calc object, in the sense of
  1258. X@code{objectp}, except for a complex number.
  1259. X@end defun
  1260. X
  1261. X@defun objvecp x
  1262. XReturns true if @var{x} is an object or a vector.  This also accepts
  1263. Xincomplete objects, but it rejects variables and formulas (except as
  1264. Xmentioned above for @code{objectp}).
  1265. X@end defun
  1266. X
  1267. X@defun primp x
  1268. XReturns true if @var{x} is a ``primitive'' or ``atomic'' Calc object,
  1269. Xi.e., one whose components cannot be regarded as sub-formulas.  This
  1270. Xincludes variables, and all @code{objectp} types except error forms
  1271. Xand intervals.
  1272. X@end defun
  1273. X
  1274. X@defun constp x
  1275. XReturns true if @var{x} is constant, i.e., a real or complex number,
  1276. XHMS form, or error form, interval, or vector all of whose components
  1277. Xare @code{constp}.
  1278. X@end defun
  1279. X
  1280. X@defun lessp x y
  1281. XReturns true if @var{x} is numerically less than @var{y}.  Returns false
  1282. Xif @var{x} is greater than or equal to @var{y}, or if the order is
  1283. Xundefined or cannot be determined.  Generally speaking, this works
  1284. Xby checking whether @samp{@var{x} - @var{y}} is @code{negp}.  In
  1285. X@code{defmath}, the expression @samp{(< x y)} will automatically be
  1286. Xconverted to @samp{(lessp x y)}; expressions involving @code{>}, @code{<=},
  1287. Xand @code{>=} are similarly converted in terms of @code{lessp}.@refill
  1288. X@end defun
  1289. X
  1290. X@defun beforep x y
  1291. XReturns true if @var{x} comes before @var{y} in a canonical ordering
  1292. Xof Calc objects.  If @var{x} and @var{y} are both real numbers, this
  1293. Xwill be the same as @code{lessp}.  But whereas @code{lessp} considers
  1294. Xother types of objects to be unordered, @code{beforep} puts any two
  1295. Xobjects into a definite, consistent order.  One application of
  1296. X@code{beforep} is that algebraic simplification rearranges the terms
  1297. Xin a product into canonical order, so that @samp{x y + y x} can
  1298. Xcheaply be simplified to @samp{2 x y}.
  1299. X@end defun
  1300. X
  1301. X@defun equal x y
  1302. XThis is the standard Lisp @code{equal} predicate; it returns true if
  1303. X@var{x} and @var{y} are structurally identical.  This is the usual way
  1304. Xto compare numbers for equality, but note that @code{equal} will treat
  1305. X0 and 0.0 as different.
  1306. X@end defun
  1307. X
  1308. X@defun math-equal x y
  1309. XReturns true if @var{x} and @var{y} are numerically equal, either because
  1310. Xthey are @code{equal}, or because their difference is @code{zerop}.  In
  1311. X@code{defmath}, the expression @samp{(= x y)} will automatically be
  1312. Xconverted to @samp{(math-equal x y)}.
  1313. X@end defun
  1314. X
  1315. X@defun equal-int x n
  1316. XReturns true if @var{x} and @var{n} are numerically equal, where @var{n}
  1317. Xis a fixnum which is not a multiple of 10.  This will automatically be
  1318. Xused by @code{defmath} in place of the more general @code{math-equal}
  1319. Xwhenever possible.@refill
  1320. X@end defun
  1321. X
  1322. X@defun nearly-equal x y
  1323. XReturns true if @var{x} and @var{y}, as floating-point numbers, are
  1324. Xequal except possibly in the last decimal place.  For example,
  1325. X314.159 and 314.166 are considered nearly equal if the current
  1326. Xprecision is 6 (since they differ by 7 units), but not if the current
  1327. Xprecision is 7 (since they differ by 70 units).  Most functions which 
  1328. Xuse series expansions use @code{with-extra-prec} to evaluate the
  1329. Xseries with 2 extra digits of precision, then use @code{nearly-equal}
  1330. Xto decide when the series has converged; this guards against cumulative
  1331. Xerror in the series evaluation without doing extra work which would be
  1332. Xlost when the result is rounded back down to the current precision.
  1333. XIn @code{defmath}, this can be written @samp{(~= @var{x} @var{y})}.
  1334. X@end defun
  1335. X
  1336. X@defun nearly-zerop x y
  1337. XReturns true if @var{x} is nearly zero, compared to @var{y}.  This
  1338. Xchecks whether @var{x} plus @var{y} would by be @code{nearly-equal}
  1339. Xto @var{y} itself, to within the current precision, in other words,
  1340. Xif adding @var{x} to @var{y} would have a negligible effect on @var{y}
  1341. SHAR_EOF
  1342. echo "End of part 18"
  1343. echo "File calc.texinfo is continued in part 19"
  1344. echo "19" > s2_seq_.tmp
  1345. exit 0
  1346.